{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "08092aa8",
   "metadata": {},
   "source": [
    "# Hyperparameter Optimization with Optuna and Transformers\n",
    "\n",
    "_Authored by: [Parag Ekbote](https://github.com/ParagEkbote)_\n",
    "\n",
    "## **Problem:** \n",
    "Find the best hyperparameters to fine-tune a lightweight BERT model for text classification on a subset of the IMDB dataset.\n",
    "\n",
    "## **Overview:**\n",
    "This recipe demonstrates how to systematically optimize hyperparameters for transformer-based text classification models using automated search techniques. You'll learn to implement HPO using Optuna to find optimal learning rates and weight decay values for fine-tuning BERT on sentiment analysis tasks.\n",
    "\n",
    "## **When to Use This Recipe:**\n",
    "\n",
    "* You need to fine-tune pre-trained language models for classification tasks.\n",
    "\n",
    "* Your model performance is plateauing and requires parameter refinement.\n",
    "\n",
    "* You want to implement systematic, reproducible hyperparameter optimization.\n",
    "\n",
    "### Notes\n",
    "\n",
    "* For detailed guidance on hyperparameter search with Transformers, refer to the [Hugging Face HPO documentation](https://huggingface.co/docs/transformers/en/hpo_train)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a309e1a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install -q datasets evaluate transformers optuna wandb scikit-learn nbformat matplotlib"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eff9ccd6",
   "metadata": {},
   "source": [
    "## Prepare Dataset and Set Model\n",
    "\n",
    "Before you can train and evaluate a sentiment analysis model, you’ll need to prep the dataset. This section ensures that your data is structured and your model is primed for learning from scratch or fine-tuning in the case of BERT.\n",
    "\n",
    "\n",
    "### 1. **Load the IMDB Dataset**  \n",
    "   Begin by selecting a dataset focused on sentiment classification. IMDB is a well-known benchmark that features movie reviews labeled as either positive or negative.\n",
    "\n",
    "### 2. **Select Input and Output Columns**  \n",
    "   Focus only on the essentials:  \n",
    "   - `text` column serves as the input (review content)  \n",
    "   - `label` column serves as the target (0 for negative, 1 for positive sentiment)\n",
    "\n",
    "### 3. **Define the Train/Validation Split**  \n",
    "   Choose a consistent sampling strategy by selecting:  \n",
    "   - 2000 examples for training  \n",
    "   - 1000 examples for validation  \n",
    "   Use a fixed random seed when shuffling to ensure reproducibility across sessions.\n",
    "\n",
    "### 4. **Tokenize the Dataset**  \n",
    "   Apply a tokenizer compatible with the model you're planning to use. Tokenization converts raw text into numerical format so the model can ingest it effectively. Use batch processing to make this step efficient.\n",
    "\n",
    "### 5. **Load an Evaluation Metric**  \n",
    "   Choose “accuracy” as the primary evaluation metric—simple and effective for binary classification tasks like this. It will later help gauge how well your model is learning the difference between positive and negative sentiment.\n",
    "\n",
    "### 6. **Initialize a Pretrained BERT Model**  \n",
    "   Select a pretrained BERT-based model tailored for sequence classification tasks. Set the number of output classes to 2 (positive and negative) to align with your sentiment labels. This model will serve as the learner throughout the training process."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2cfb9d5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8ee77ecb1a0f41c2a715840e76cd5727",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "config.json:   0%|          | 0.00/285 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fd042613685f42dbbb6ff5c51d17b915",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "vocab.txt: 0.00B [00:00, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "07fb47d86d11433aacc67d4782090b17",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/2500 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d16d34949ee74f31bdc80b1bc75b2e19",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/1000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from datasets import load_dataset\n",
    "import evaluate\n",
    "\n",
    "from transformers import AutoModelForSequenceClassification\n",
    "from transformers import AutoTokenizer\n",
    "from transformers import set_seed\n",
    "\n",
    "set_seed(42)\n",
    "\n",
    "\n",
    "train_dataset = load_dataset(\"imdb\", split=\"train\").shuffle(seed=42).select(range(2500))\n",
    "valid_dataset = load_dataset(\"imdb\", split=\"test\").shuffle(seed=42).select(range(1000))\n",
    "\n",
    "model_name = \"prajjwal1/bert-tiny\"\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
    "\n",
    "def tokenize(batch):\n",
    "    return tokenizer(batch[\"text\"], padding=\"max_length\", truncation=True, max_length=512)\n",
    "\n",
    "tokenized_train = train_dataset.map(tokenize, batched=True).select_columns(\n",
    "    [\"input_ids\", \"attention_mask\", \"label\"]\n",
    ")\n",
    "tokenized_valid = valid_dataset.map(tokenize, batched=True).select_columns(\n",
    "    [\"input_ids\", \"attention_mask\", \"label\"]\n",
    ")\n",
    "\n",
    "metric = evaluate.load(\"accuracy\")\n",
    "\n",
    "\n",
    "def model_init():\n",
    "    return AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "105d9e01",
   "metadata": {},
   "source": [
    "## Define Storage with Optuna\n",
    "\n",
    "To ensure your hyperparameter optimization experiments are trackable, reproducible, and easy to analyze over time, it’s essential to use a persistent storage backend. Optuna provides a robust solution for this through its `RDBStorage` mechanism, which allows saving trial data across multiple sessions using an SQLite database.\n",
    "\n",
    "\n",
    "### 1. **Choose a Persistent Storage Format**  \n",
    "   Opt for an SQLite database as the storage medium. It’s lightweight, portable, and ideal for local experimentation, while still enabling structured access to all trial data.\n",
    "\n",
    "### 2. **Enable Optuna's RDBStorage**  \n",
    "   RDBStorage (Relational Database Storage) is Optuna’s way of saving trial results in a consistent and queryable format. This bridges the gap between short-term experimentation and long-term analysis.\n",
    "\n",
    "### 3. **Preserve Trial History Across Sessions**  \n",
    "   By setting up persistent storage, you ensure that every hyperparameter trial is recorded. You can pause and resume studies, add more trials later, or analyze outcomes long after training has ended.\n",
    "\n",
    "### 4. **Facilitate Reproducible Analysis**  \n",
    "   With trials stored centrally, you can revisit earlier results, regenerate visualizations, or compare different optimization runs. This makes your workflow transparent, collaborative, and scientifically rigorous.\n",
    "\n",
    "### 5. **Support Visualization and Monitoring Tools**  \n",
    "   Storing trials persistently lets you plug in visualization tools—like Optuna’s built-in plotting utilities or external dashboards—to inspect performance trends and refine your search space iteratively."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7652b74b",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:10:18,724] A new study created in RDB with name: transformers_optuna_study\n"
     ]
    }
   ],
   "source": [
    "import optuna\n",
    "from optuna.storages import RDBStorage\n",
    "\n",
    "# Define persistent storage\n",
    "storage = RDBStorage(\"sqlite:///optuna_trials.db\")\n",
    "\n",
    "study = optuna.create_study(\n",
    "    study_name=\"transformers_optuna_study\",\n",
    "    direction=\"maximize\",\n",
    "    storage=storage,\n",
    "    load_if_exists=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a46fac4",
   "metadata": {},
   "source": [
    "## Initialize Trainer and Set Up Observability\n",
    "\n",
    "Now that your hyperparameter search space is in place, the next step is to wire everything together for optimization and tracking. This setup ensures not only accuracy-driven tuning but also full visibility into the training process using Weight & Biases (W&B).\n",
    "\n",
    "### 1. **Define the Metric Function**  \n",
    "   Start by specifying how model performance will be measured. This metric function evaluates predictions after each validation step to calculate accuracy, F1-score, or loss. It becomes the feedback loop guiding each trial’s learning progress.\n",
    "\n",
    "### 2. **Construct the Objective Function**  \n",
    "   This is the centerpiece of hyperparameter optimization. It wraps your training loop and returns a scalar score based on the chosen metric (like validation accuracy). Optuna will use this to compare trials and decide which settings yield the best outcomes.\n",
    "\n",
    "### 3. **Set Up Weight & Biases for Observability**  \n",
    "   Configure your environment to log experiment metrics and hyperparameter configurations to W&B. This platform offers dashboards, plots, and experiment comparisons to track progress and spot issues.\n",
    "\n",
    "### 4. **Authenticate for Logging Access**  \n",
    "   Log in to W&B using your personal API key. This step connects your training session to your online account so that all metrics and trial details are properly tracked and stored.\n",
    "\n",
    "### 5. **Define Trainer Arguments**  \n",
    "   Prepare a configuration setup for your training manager (such as the Hugging Face `Trainer`). Include settings for:\n",
    "   - Evaluation strategy (e.g. after every epoch)\n",
    "   - Checkpoint frequency and save conditions\n",
    "   - Logging intervals\n",
    "   - Hyperparameter search method and objectives\n",
    "\n",
    "   This ensures that training is robust, reproducible, and easy to resume or analyze."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e0ee0bae",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mai_novice2005\u001b[0m to \u001b[32mhttps://api.wandb.ai\u001b[0m. Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.20.1"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/teamspace/studios/this_studio/cookbook/notebooks/en/wandb/run-20250625_151029-ivr2ci8c</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ai_novice2005/hf-optuna/runs/ivr2ci8c' target=\"_blank\">transformers_optuna_study</a></strong> to <a href='https://wandb.ai/ai_novice2005/hf-optuna' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/developer-guide' target=\"_blank\">docs</a>)<br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ai_novice2005/hf-optuna' target=\"_blank\">https://wandb.ai/ai_novice2005/hf-optuna</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ai_novice2005/hf-optuna/runs/ivr2ci8c' target=\"_blank\">https://wandb.ai/ai_novice2005/hf-optuna/runs/ivr2ci8c</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2a4b6835e125481597ce8871f368aeeb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "pytorch_model.bin:   0%|          | 0.00/17.8M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at prajjwal1/bert-tiny and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a570d3ad87c44539a0eef1321dc34afc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "model.safetensors:   0%|          | 0.00/17.7M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import wandb\n",
    "from transformers import Trainer, TrainingArguments\n",
    "\n",
    "def compute_metrics(eval_pred):\n",
    "    predictions = eval_pred.predictions.argmax(axis=-1)\n",
    "    labels = eval_pred.label_ids\n",
    "    return metric.compute(predictions=predictions, references=labels)\n",
    "\n",
    "\n",
    "def compute_objective(metrics):\n",
    "    return metrics[\"eval_accuracy\"]\n",
    "\n",
    "wandb.init(project=\"hf-optuna\", name=\"transformers_optuna_study\")\n",
    "\n",
    "training_args = TrainingArguments(\n",
    "    output_dir=\"./results\",\n",
    "        eval_strategy=\"epoch\",\n",
    "        save_strategy=\"epoch\",\n",
    "        load_best_model_at_end=True,\n",
    "        logging_strategy=\"epoch\",\n",
    "        num_train_epochs=3,\n",
    "        report_to=\"wandb\",  # Logs to W&B\n",
    "        logging_dir=\"./logs\",\n",
    "        run_name=\"transformers_optuna_study\",\n",
    ")\n",
    "\n",
    "\n",
    "trainer = Trainer(\n",
    "    model_init=model_init,\n",
    "    args=training_args,\n",
    "    train_dataset=tokenized_train,\n",
    "    eval_dataset=tokenized_valid,\n",
    "    processing_class=tokenizer,\n",
    "    compute_metrics=compute_metrics,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b10c26c6",
   "metadata": {},
   "source": [
    "## Define Search Space and Start Trials\n",
    "\n",
    "Before diving into model training, it’s essential to thoughtfully define the ingredients and the exploration strategy. This step sets the stage for hyperparameter optimization using Optuna, where you'll systematically explore combinations of training parameters like learning rate, weight decay, and batch size.\n",
    "\n",
    "### 1. **Design the Search Space**  \n",
    "   Begin by outlining the hyperparameters you want to optimize. Choose reasonable lower and upper bounds for each:\n",
    "   - *Learning rate*—controls the step size during optimization.\n",
    "   - *Weight decay*—adds regularization to reduce overfitting.\n",
    "   - *Batch size*—affects memory use and convergence stability.\n",
    "\n",
    "### 2. **Set the Optimization Direction**  \n",
    "   Decide whether your goal is to minimize (e.g. loss) or maximize (e.g. accuracy, F1 score) the evaluation metric. This guides the search engine in the right direction.\n",
    "\n",
    "### 3. **Choose Optuna as the Backend**  \n",
    "   Optuna will handle the search process—selecting, evaluating, and iterating through hyperparameter combinations intelligently.\n",
    "\n",
    "### 4. **Specify the Number of Trials**  \n",
    "   Define how many individual runs (\"trials\") you want Optuna to attempt. More trials can explore the space better but take more time.\n",
    "\n",
    "### 5. **Define the Objective Function**  \n",
    "   This function calculates the metric to be optimized during each trial. It encapsulates how the model is trained and how performance is evaluated after each configuration is tested.\n",
    "\n",
    "### 6. **Name the Study for Persistence**  \n",
    "   Assign a name to your study so it can be resumed or referenced later. This is especially useful when running experiments over multiple sessions or machines.\n",
    "\n",
    "### 7. **Set Up Persistent Storage**  \n",
    "   Choose the storage backend that we previously setup to let you continue the study later, analyze results, or visualize metrics even after a system reboot.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4ef88312",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:10:41,259] Using an existing study with name 'transformers_optuna_study' instead of creating a new one.\n",
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at prajjwal1/bert-tiny and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run <strong style=\"color:#cdcd00\">transformers_optuna_study</strong> at: <a href='https://wandb.ai/ai_novice2005/hf-optuna/runs/ivr2ci8c' target=\"_blank\">https://wandb.ai/ai_novice2005/hf-optuna/runs/ivr2ci8c</a><br> View project at: <a href='https://wandb.ai/ai_novice2005/hf-optuna' target=\"_blank\">https://wandb.ai/ai_novice2005/hf-optuna</a><br>Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Find logs at: <code>./wandb/run-20250625_151029-ivr2ci8c/logs</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.20.1"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/teamspace/studios/this_studio/cookbook/notebooks/en/wandb/run-20250625_151042-up8j8xgb</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ai_novice2005/huggingface/runs/up8j8xgb' target=\"_blank\">leafy-breeze-5</a></strong> to <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/developer-guide' target=\"_blank\">docs</a>)<br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ai_novice2005/huggingface/runs/up8j8xgb' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/up8j8xgb</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='471' max='471' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [471/471 00:24, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.649200</td>\n",
       "      <td>0.605374</td>\n",
       "      <td>0.682000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.529900</td>\n",
       "      <td>0.528273</td>\n",
       "      <td>0.751000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.440700</td>\n",
       "      <td>0.509003</td>\n",
       "      <td>0.764000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:11:09,298] Trial 0 finished with value: 0.764 and parameters: {'learning_rate': 7.23655165533393e-05, 'per_device_train_batch_size': 16, 'weight_decay': 0.013798094328723032}. Best is trial 0 with value: 0.764.\n",
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at prajjwal1/bert-tiny and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<br>    <style><br>        .wandb-row {<br>            display: flex;<br>            flex-direction: row;<br>            flex-wrap: wrap;<br>            justify-content: flex-start;<br>            width: 100%;<br>        }<br>        .wandb-col {<br>            display: flex;<br>            flex-direction: column;<br>            flex-basis: 100%;<br>            flex: 1;<br>            padding: 10px;<br>        }<br>    </style><br><div class=\"wandb-row\"><div class=\"wandb-col\"><h3>Run history:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>▁▇█</td></tr><tr><td>eval/loss</td><td>█▂▁</td></tr><tr><td>eval/runtime</td><td>█▇▁</td></tr><tr><td>eval/samples_per_second</td><td>▁▂█</td></tr><tr><td>eval/steps_per_second</td><td>▁▂█</td></tr><tr><td>train/epoch</td><td>▁▁▅▅███</td></tr><tr><td>train/global_step</td><td>▁▁▄▄███</td></tr><tr><td>train/grad_norm</td><td>▁█▂</td></tr><tr><td>train/learning_rate</td><td>█▅▁</td></tr><tr><td>train/loss</td><td>█▄▁</td></tr></table><br/></div><div class=\"wandb-col\"><h3>Run summary:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>0.764</td></tr><tr><td>eval/loss</td><td>0.509</td></tr><tr><td>eval/runtime</td><td>1.0937</td></tr><tr><td>eval/samples_per_second</td><td>914.299</td></tr><tr><td>eval/steps_per_second</td><td>114.287</td></tr><tr><td>total_flos</td><td>9528652800000.0</td></tr><tr><td>train/epoch</td><td>3</td></tr><tr><td>train/global_step</td><td>471</td></tr><tr><td>train/grad_norm</td><td>13.57101</td></tr><tr><td>train/learning_rate</td><td>0.0</td></tr><tr><td>train/loss</td><td>0.4407</td></tr><tr><td>train_loss</td><td>0.53993</td></tr><tr><td>train_runtime</td><td>26.9493</td></tr><tr><td>train_samples_per_second</td><td>278.3</td></tr><tr><td>train_steps_per_second</td><td>17.477</td></tr></table><br/></div></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run <strong style=\"color:#cdcd00\">leafy-breeze-5</strong> at: <a href='https://wandb.ai/ai_novice2005/huggingface/runs/up8j8xgb' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/up8j8xgb</a><br> View project at: <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a><br>Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Find logs at: <code>./wandb/run-20250625_151042-up8j8xgb/logs</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.20.1"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/teamspace/studios/this_studio/cookbook/notebooks/en/wandb/run-20250625_151110-1dgqb1s1</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ai_novice2005/huggingface/runs/1dgqb1s1' target=\"_blank\">radiant-sound-6</a></strong> to <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/developer-guide' target=\"_blank\">docs</a>)<br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ai_novice2005/huggingface/runs/1dgqb1s1' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/1dgqb1s1</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='60' max='60' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [60/60 00:18, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.683100</td>\n",
       "      <td>0.677468</td>\n",
       "      <td>0.613000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.673100</td>\n",
       "      <td>0.669755</td>\n",
       "      <td>0.639000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.669500</td>\n",
       "      <td>0.667655</td>\n",
       "      <td>0.630000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:11:29,907] Trial 1 finished with value: 0.63 and parameters: {'learning_rate': 2.756288216246014e-05, 'per_device_train_batch_size': 128, 'weight_decay': 0.28503663896216014}. Best is trial 0 with value: 0.764.\n",
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at prajjwal1/bert-tiny and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<br>    <style><br>        .wandb-row {<br>            display: flex;<br>            flex-direction: row;<br>            flex-wrap: wrap;<br>            justify-content: flex-start;<br>            width: 100%;<br>        }<br>        .wandb-col {<br>            display: flex;<br>            flex-direction: column;<br>            flex-basis: 100%;<br>            flex: 1;<br>            padding: 10px;<br>        }<br>    </style><br><div class=\"wandb-row\"><div class=\"wandb-col\"><h3>Run history:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>▁█▆</td></tr><tr><td>eval/loss</td><td>█▂▁</td></tr><tr><td>eval/runtime</td><td>▁█▂</td></tr><tr><td>eval/samples_per_second</td><td>█▁▇</td></tr><tr><td>eval/steps_per_second</td><td>█▁▇</td></tr><tr><td>train/epoch</td><td>▁▁▅▅███</td></tr><tr><td>train/global_step</td><td>▁▁▅▅███</td></tr><tr><td>train/grad_norm</td><td>▅█▁</td></tr><tr><td>train/learning_rate</td><td>█▄▁</td></tr><tr><td>train/loss</td><td>█▃▁</td></tr></table><br/></div><div class=\"wandb-col\"><h3>Run summary:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>0.63</td></tr><tr><td>eval/loss</td><td>0.66765</td></tr><tr><td>eval/runtime</td><td>1.111</td></tr><tr><td>eval/samples_per_second</td><td>900.116</td></tr><tr><td>eval/steps_per_second</td><td>112.515</td></tr><tr><td>total_flos</td><td>9528652800000.0</td></tr><tr><td>train/epoch</td><td>3</td></tr><tr><td>train/global_step</td><td>60</td></tr><tr><td>train/grad_norm</td><td>0.66353</td></tr><tr><td>train/learning_rate</td><td>0.0</td></tr><tr><td>train/loss</td><td>0.6695</td></tr><tr><td>train_loss</td><td>0.67521</td></tr><tr><td>train_runtime</td><td>19.5595</td></tr><tr><td>train_samples_per_second</td><td>383.445</td></tr><tr><td>train_steps_per_second</td><td>3.068</td></tr></table><br/></div></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run <strong style=\"color:#cdcd00\">radiant-sound-6</strong> at: <a href='https://wandb.ai/ai_novice2005/huggingface/runs/1dgqb1s1' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/1dgqb1s1</a><br> View project at: <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a><br>Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Find logs at: <code>./wandb/run-20250625_151110-1dgqb1s1/logs</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.20.1"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/teamspace/studios/this_studio/cookbook/notebooks/en/wandb/run-20250625_151130-jt5mavd3</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ai_novice2005/huggingface/runs/jt5mavd3' target=\"_blank\">ancient-dream-7</a></strong> to <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/developer-guide' target=\"_blank\">docs</a>)<br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ai_novice2005/huggingface/runs/jt5mavd3' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/jt5mavd3</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='120' max='120' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [120/120 00:20, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.690300</td>\n",
       "      <td>0.688425</td>\n",
       "      <td>0.553000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.689100</td>\n",
       "      <td>0.687775</td>\n",
       "      <td>0.562000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.689100</td>\n",
       "      <td>0.687576</td>\n",
       "      <td>0.570000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:11:52,797] Trial 2 finished with value: 0.57 and parameters: {'learning_rate': 1.2177346043359053e-06, 'per_device_train_batch_size': 64, 'weight_decay': 0.02906341093983704}. Best is trial 0 with value: 0.764.\n",
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at prajjwal1/bert-tiny and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<br>    <style><br>        .wandb-row {<br>            display: flex;<br>            flex-direction: row;<br>            flex-wrap: wrap;<br>            justify-content: flex-start;<br>            width: 100%;<br>        }<br>        .wandb-col {<br>            display: flex;<br>            flex-direction: column;<br>            flex-basis: 100%;<br>            flex: 1;<br>            padding: 10px;<br>        }<br>    </style><br><div class=\"wandb-row\"><div class=\"wandb-col\"><h3>Run history:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>▁▅█</td></tr><tr><td>eval/loss</td><td>█▃▁</td></tr><tr><td>eval/runtime</td><td>▁██</td></tr><tr><td>eval/samples_per_second</td><td>█▁▁</td></tr><tr><td>eval/steps_per_second</td><td>█▁▁</td></tr><tr><td>train/epoch</td><td>▁▁▅▅███</td></tr><tr><td>train/global_step</td><td>▁▁▅▅███</td></tr><tr><td>train/grad_norm</td><td>▆█▁</td></tr><tr><td>train/learning_rate</td><td>█▅▁</td></tr><tr><td>train/loss</td><td>█▁▁</td></tr></table><br/></div><div class=\"wandb-col\"><h3>Run summary:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>0.57</td></tr><tr><td>eval/loss</td><td>0.68758</td></tr><tr><td>eval/runtime</td><td>1.0959</td></tr><tr><td>eval/samples_per_second</td><td>912.502</td></tr><tr><td>eval/steps_per_second</td><td>114.063</td></tr><tr><td>total_flos</td><td>9528652800000.0</td></tr><tr><td>train/epoch</td><td>3</td></tr><tr><td>train/global_step</td><td>120</td></tr><tr><td>train/grad_norm</td><td>2.34479</td></tr><tr><td>train/learning_rate</td><td>0.0</td></tr><tr><td>train/loss</td><td>0.6891</td></tr><tr><td>train_loss</td><td>0.68947</td></tr><tr><td>train_runtime</td><td>21.6288</td></tr><tr><td>train_samples_per_second</td><td>346.76</td></tr><tr><td>train_steps_per_second</td><td>5.548</td></tr></table><br/></div></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run <strong style=\"color:#cdcd00\">ancient-dream-7</strong> at: <a href='https://wandb.ai/ai_novice2005/huggingface/runs/jt5mavd3' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/jt5mavd3</a><br> View project at: <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a><br>Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Find logs at: <code>./wandb/run-20250625_151130-jt5mavd3/logs</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.20.1"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/teamspace/studios/this_studio/cookbook/notebooks/en/wandb/run-20250625_151153-6eexo8uv</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ai_novice2005/huggingface/runs/6eexo8uv' target=\"_blank\">grateful-sound-8</a></strong> to <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/developer-guide' target=\"_blank\">docs</a>)<br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ai_novice2005/huggingface/runs/6eexo8uv' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/6eexo8uv</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='120' max='120' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [120/120 00:16, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.689400</td>\n",
       "      <td>0.686730</td>\n",
       "      <td>0.570000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.687000</td>\n",
       "      <td>0.685327</td>\n",
       "      <td>0.581000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.686700</td>\n",
       "      <td>0.684904</td>\n",
       "      <td>0.581000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:12:12,894] Trial 3 finished with value: 0.581 and parameters: {'learning_rate': 2.973185825213819e-06, 'per_device_train_batch_size': 64, 'weight_decay': 0.09102292466460353}. Best is trial 0 with value: 0.764.\n",
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at prajjwal1/bert-tiny and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<br>    <style><br>        .wandb-row {<br>            display: flex;<br>            flex-direction: row;<br>            flex-wrap: wrap;<br>            justify-content: flex-start;<br>            width: 100%;<br>        }<br>        .wandb-col {<br>            display: flex;<br>            flex-direction: column;<br>            flex-basis: 100%;<br>            flex: 1;<br>            padding: 10px;<br>        }<br>    </style><br><div class=\"wandb-row\"><div class=\"wandb-col\"><h3>Run history:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>▁██</td></tr><tr><td>eval/loss</td><td>█▃▁</td></tr><tr><td>eval/runtime</td><td>▁█▃</td></tr><tr><td>eval/samples_per_second</td><td>█▁▆</td></tr><tr><td>eval/steps_per_second</td><td>█▁▆</td></tr><tr><td>train/epoch</td><td>▁▁▅▅███</td></tr><tr><td>train/global_step</td><td>▁▁▅▅███</td></tr><tr><td>train/grad_norm</td><td>▆█▁</td></tr><tr><td>train/learning_rate</td><td>█▅▁</td></tr><tr><td>train/loss</td><td>█▂▁</td></tr></table><br/></div><div class=\"wandb-col\"><h3>Run summary:</h3><br/><table class=\"wandb\"><tr><td>eval/accuracy</td><td>0.581</td></tr><tr><td>eval/loss</td><td>0.6849</td></tr><tr><td>eval/runtime</td><td>1.0808</td></tr><tr><td>eval/samples_per_second</td><td>925.219</td></tr><tr><td>eval/steps_per_second</td><td>115.652</td></tr><tr><td>total_flos</td><td>9528652800000.0</td></tr><tr><td>train/epoch</td><td>3</td></tr><tr><td>train/global_step</td><td>120</td></tr><tr><td>train/grad_norm</td><td>2.30065</td></tr><tr><td>train/learning_rate</td><td>0.0</td></tr><tr><td>train/loss</td><td>0.6867</td></tr><tr><td>train_loss</td><td>0.68768</td></tr><tr><td>train_runtime</td><td>18.9103</td></tr><tr><td>train_samples_per_second</td><td>396.61</td></tr><tr><td>train_steps_per_second</td><td>6.346</td></tr></table><br/></div></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run <strong style=\"color:#cdcd00\">grateful-sound-8</strong> at: <a href='https://wandb.ai/ai_novice2005/huggingface/runs/6eexo8uv' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/6eexo8uv</a><br> View project at: <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a><br>Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Find logs at: <code>./wandb/run-20250625_151153-6eexo8uv/logs</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.20.1"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/teamspace/studios/this_studio/cookbook/notebooks/en/wandb/run-20250625_151213-5w18j6iv</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ai_novice2005/huggingface/runs/5w18j6iv' target=\"_blank\">hopeful-moon-9</a></strong> to <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/developer-guide' target=\"_blank\">docs</a>)<br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ai_novice2005/huggingface' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ai_novice2005/huggingface/runs/5w18j6iv' target=\"_blank\">https://wandb.ai/ai_novice2005/huggingface/runs/5w18j6iv</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='120' max='120' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [120/120 00:17, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.689000</td>\n",
       "      <td>0.686028</td>\n",
       "      <td>0.573000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.686100</td>\n",
       "      <td>0.684337</td>\n",
       "      <td>0.589000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.685700</td>\n",
       "      <td>0.683833</td>\n",
       "      <td>0.597000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-06-25 15:12:32,824] Trial 4 finished with value: 0.597 and parameters: {'learning_rate': 3.763988365260261e-06, 'per_device_train_batch_size': 64, 'weight_decay': 0.1502192542358606}. Best is trial 0 with value: 0.764.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BestRun(run_id='0', objective=0.764, hyperparameters={'learning_rate': 7.23655165533393e-05, 'per_device_train_batch_size': 16, 'weight_decay': 0.013798094328723032}, run_summary=None)\n"
     ]
    }
   ],
   "source": [
    "def optuna_hp_space(trial):\n",
    "    return {\n",
    "        \"learning_rate\": trial.suggest_float(\"learning_rate\", 1e-6, 1e-4, log=True),\n",
    "        \"per_device_train_batch_size\": trial.suggest_categorical(\n",
    "            \"per_device_train_batch_size\", [16, 32, 64, 128]\n",
    "        ),\n",
    "        \"weight_decay\": trial.suggest_float(\"weight_decay\", 0.0, 0.3),\n",
    "    }\n",
    "\n",
    "\n",
    "best_run = trainer.hyperparameter_search(\n",
    "    direction=\"maximize\",\n",
    "    backend=\"optuna\",\n",
    "    hp_space=optuna_hp_space,\n",
    "    n_trials=5,\n",
    "    compute_objective=compute_objective,\n",
    "    study_name=\"transformers_optuna_study\",\n",
    "    storage=\"sqlite:///optuna_trials.db\",\n",
    "    load_if_exists=True\n",
    ")\n",
    "\n",
    "print(best_run)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26a95ef3",
   "metadata": {},
   "source": [
    "## Visualize Results\n",
    "\n",
    "Once your Optuna study completes its trials, it’s time to peel back the layers and interpret what happened. Visualization brings clarity to how hyperparameters shaped the outcome and uncovers patterns that might otherwise stay buried in raw data.\n",
    "\n",
    "### 1. **Track Optimization Progress**  \n",
    "   Use the optimization history to see how objective scores evolved over trials. This helps you understand whether performance steadily improved, plateaued, or oscillated. It’s your window into the pace and trajectory of the search process.\n",
    "\n",
    "### 2. **Inspect Training Behavior via Intermediate Values**  \n",
    "   If your model reports evaluation metrics during training (like per epoch), intermediate value plots let you monitor how each trial performed in real time. This is especially valuable for early-stopping decisions and assessing learning stability.\n",
    "\n",
    "### 3. **Reveal Key Hyperparameters through Importance Rankings**  \n",
    "   Parameter importance plots uncover which hyperparameters actually mattered—did tweaking the learning rate move the needle, or was batch size the star? Understanding this lets you simplify or refine your future search space."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a8f14007",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_16014/3851300317.py:18: ExperimentalWarning: plot_optimization_history is experimental (supported from v2.2.0). The interface can change in the future.\n",
      "  ax1 = plot_optimization_history(study)\n"
     ]
    },
    {
     "data": {
      "image/png": "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bSIiIiIik2NyxUKzZs2Qnp6O6OhoqFQq+Pr6YuLEidphSGlpaXp3Q0hKSsK///6LyZMn6/V37949HD9+HADw8ccf62ybMmUKatSoAaVSidjYWPzxxx/Izc2Fu7s7OnfurDMngYiIiIjoZSOIHPxnVKmpqTq3VH1RgiCgYsWKuHPnjmzHaco9R+Zn/uSeo9zzA+SfI/MznKWlJSc4ExXCpOYsEBERERGR6WCxQEREREREklgsEBERERGRJBYLREREREQkicUCERERERFJYrFARERERESSWCwQEREREZEkFgtERERERCSJxQIREREREUlisUBERERERJJYLBARERERkSQWC0REREREJInFAhERERERSWKxQEREREREklgsEBERERGRJBYLREREREQkicUCERERERFJYrFARERERESSWCwQEREREZEkFgtERERERCSJxQIREREREUlisUBERERERJJYLBARERERkSQWC0REREREJInFAhERERERSWKxQEREREREklgsEBERERGRJBYLREREREQkicUCERERERFJYrFARERERESSWCwQEREREZEkpaE7ajQaHDlyBOfPn8eDBw/Qu3dveHt7IysrC+fOnUO1atXg5ORkxFCJiIiIiKg0GVQsZGZm4osvvsDly5dhbW2N7OxsdOrUCQBgbW2NZcuW4bXXXkNERIRBQe3cuRNbtmyBSqWCj48PBg0ahICAAMm2U6dOxYULF/TW161bFxMmTAAAiKKI6Oho/PXXX8jMzET16tUxePBgVKxYUds+IyMDv/zyC06cOAFBENC4cWMMHDgQ1tbWBuVARERERGTuDBqGtHLlSty8eROTJk3Cjz/+qNuhQoEmTZrg1KlTBgUUGxuLqKgo9OjRA7NmzYKPjw9mzpyJBw8eSLYfO3YsFi9erP337bffQqFQoGnTpto2mzZtwo4dOxAZGYkvvvgC5cqVw8yZM5GTk6NtM3fuXNy8eROTJ0/G+PHj8c8//2DRokUG5UBEREREJAcGFQvHjh1Dx44dUatWLQiCoLe9YsWKSE1NNSigrVu3ok2bNmjVqhUqV66MyMhIWFlZYe/evZLt7e3t4eTkpP139uxZlCtXDk2aNAHw5KrC9u3b0b17dzRs2BA+Pj54//33cf/+fRw7dgwAcOvWLZw+fRrvvfceAgMDUb16dQwaNAixsbG4d++e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WLEC1atXR/PmzdGoUaNCn8NARERERESmz+A5C66urujatSu6du2Ku3fvaguHn3/+GUuXLkXNmjUxadIkY8ZKRERERESlyKA5C8/y8PBAt27dMGvWLERGRsLKygpnz541RtdERERERFRGXuhuSPkSEhJw5MgRHD16FPfu3YO1tTVCQkKM0TUREREREZURg4uFxMRE7dCjtLQ0WFlZoX79+mjWrBnq1q0LS0tLY8ZJRERERESlzKBiYeTIkUhJSYFSqUTdunXx1ltvoX79+ihXrpyx4yMiIiIiojJiULFQqVIl9OzZEw0bNoSNjY2xYyIiIiIiIhNgULEwfvx4Y8dBREREREQmpkjFQlpaGoAnt0t9evl58tsTEREREZH5KVKxMGLECADAypUroVQqtcvP8/vvvxseGRERERERlakiFQvDhg0DAFhYWOgsExERERGRfBWpWAgNDS10mYiIiIiI5MegJzgvWLAAly5dKnD75cuXsWDBAoODIiIiIiKismdQsbB//37cvXu3wO0pKSnYv3+/wUEREREREVHZM6hYeJ579+7BysqqJLomIiIiIqJSUuTnLBw7dgzHjh3TLv/55584e/asXrusrCycO3cOAQEBxomQiIiIiIjKRJGLhVu3buHo0aPa5UuXLiExMVGnjSAIKFeuHF555RX069fPeFESEREREVGpK3Kx0K1bN3Tr1g0A0Lt3bwwbNgwhISElFhgREREREZWtIhcLT+PD1oiIiIiI5M+gCc6JiYnYtWtXgdt37dqFa9euGRoTERERERGZAIOKhTVr1uDcuXMFbo+Pj8eaNWsMDoqIiIiIiMqewVcWqlevXuD2V155BVeuXDE4KCIiIiIiKnsGFQuPHj2ChYVFgdsFQUBWVpbBQRERERERUdkzqFioWLEizpw5U+D206dPw8PDw+CgiIiIiIio7BlULLRu3RqnTp3CihUrkJmZqV2fmZmJ5cuX4/Tp02jdurXRgiQiIiIiotJn0K1TO3XqhGvXrmH79u3YsWMHnJ2dAQD379+HKIpo0aIFOnfubFBAO3fuxJYtW6BSqeDj44NBgwYV+jTozMxMrF69GnFxccjIyICbmxv69++PevXqAQCio6Oxdu1anX28vLwwZ84c7XJOTg6ioqIQGxuL3Nxc1K5dG4MHD4aTk5NBORARERERyYFBxYIgCBg+fDhee+01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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_16014/3851300317.py:23: ExperimentalWarning: plot_intermediate_values is experimental (supported from v2.2.0). The interface can change in the future.\n",
      "  ax2 = plot_intermediate_values(study)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAHWCAYAAADzS2TwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdKdJREFUeJzt3Xl8U1X+P/7Xzdp0SdPSnUJLKIusRfZN1i9uKDADIqAjIjgi7usH0bEMIqKjoqKOv3FBdJRFRUQQlXWECmVVCipLgbJ0b9M0bZMmuef3R2k0dqFNE9q0r+fjwUNyt7xzqO2r59x7jiSEECAiIiIiv6No6gKIiIiIyDMMckRERER+ikGOiIiIyE8xyBERERH5KQY5IiIiIj/FIEdERETkpxjkiIiIiPwUgxwRERGRn2KQIyIiIvJTDHJErVhiYiISExPdtq1YsQKSJGHFihVNUlNz1NraRJIkjBw5sqnLIKJ6YJAjvyBJEiRJavR1WtsP5KaUkpICSZKwY8cOn73Hf/7zH0iShFtuueWyxz7//POQJAkPPvigz+pprhITE13/D0mSBIVCAYPBgCFDhuDNN9+Ew+Hw+nvu2LEDkiQhJSXF69cmot+pmroAImpeJk2ahEGDBiE2NrapS7msadOm4ZFHHsH69euRn5+PiIiIGo8TQuC9994DANx9991XssRm5cEHH4TBYIDT6cTp06fx+eef48cff8TWrVvxxRdfNHV5ROQB9sgRkZvQ0FB07doVoaGhTV3KZQUHB2PatGmoqKjAypUraz1u27ZtyMjIwJAhQ9C9e/crWGHz8tBDDyElJQWLFi3Cxx9/jP3790On02HdunXYuXNnU5dHRB5gkCO/debMGUiShJkzZ+LMmTO49dZbERERgYCAAPTr1w9ff/212/EjR47EnXfeCQC488473Yaazpw54zrO4XDgrbfewqBBg6DX6xEYGIg+ffpg+fLlkGW51hqOHz+OqVOnIioqCgqFAjt27HDbf+rUKUyePBlt2rRBSEgIxo0bh/T0dABAXl4e7r77bsTGxiIgIAD9+/fH9u3ba/zcDakPqOyNWr58Obp3746AgAC0bdsW9913H4qLi2u8fm3Dz9u3b8fdd9+Nbt26Qa/XQ6fToUePHli4cCGsVqvbsYmJiVi4cCEAYNSoUW5t/UdlZWVYsmQJkpOTERQUhODgYAwePBiffvppjbXVpKqH7d133631mP/85z9uxx44cAAPPvggevfujfDwcAQEBKBTp0549NFHUVRUVO/3rutespkzZ1b72qqyd+9eTJ48GTExMdBoNGjXrh3+/ve/4+LFi9WOzcjIwN13342kpCTodDqEh4ejZ8+euOeee1BQUFDvWmvSvXt3V/1paWmXPb64uBjz589Hly5dEBAQgLCwMFx77bXYsmWL23EzZ87EqFGjAAALFy50+/f35VA7UWvEoVXye2fPnsWAAQNgNBpx++23o7CwEKtXr8aECROwZcsW1w+UmTNnwmAwYP369ZgwYQKSk5Nd1zAYDAAAu92Om266Cd9++y26dOmC6dOnIyAgANu3b8f999+PvXv34qOPPqpWw6lTpzBw4EB07twZM2bMQHl5OfR6vWv/mTNnMHDgQFx11VWu4Llu3TqMHDkSP/74I6677jro9XpMnToVhYWFWLVqFa6//nocP34c7du3d13Hk/oeeughvP7664iNjcXdd98NtVqN9evXY+/evaioqIBGo6lXOy9duhS//vorhgwZghtvvBFWqxW7d+9GSkoKduzYgS1btkCpVLre88svv8TOnTtxxx13VHugAgBMJhNGjx6NQ4cO4eqrr8asWbMgyzK+/fZbTJ8+HUePHsVzzz132br69euH5ORkHD58GLt378bQoUPd9hcUFODLL79EaGio6166//znP1i3bh1GjBiBsWPHQpZlHDhwAK+88gq++eYb7N27FyEhIfVql4Z6//33cffdd0Or1eLmm29Gu3btcOLECbz77rvYsGED9uzZ4/o3z8rKQv/+/WE2m3HDDTfgr3/9K6xWK06fPo2PPvoI9913H9q0adOoeoQQAHDZe1BNJhOGDh2KY8eOoX///njooYeQn5+PNWvWYNy4cXj77bfx97//HQAwceJEAMCHH36IESNGuIXdmr4WiKgRBJEfACD+/OV6+vRp1/aUlBS3fZs3bxYAxPXXX++2/YMPPhAAxAcffFDj+zz77LMCgLjvvvuEw+FwbXc4HGLWrFkCgPjyyy9rrGH+/PnVrvfH/c8995zbvn/+858CgAgLCxN///vfhdPpdO1buXKlACAeeuihRtW3e/duAUB07NhRFBQUuLaXl5eLQYMGCQAiISGhXm106tQpIctytc/49NNPCwBi1apVNda6ffv2aucIIcQd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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_16014/3851300317.py:28: ExperimentalWarning: plot_param_importances is experimental (supported from v2.2.0). The interface can change in the future.\n",
      "  ax3 = plot_param_importances(study)\n"
     ]
    },
    {
     "data": {
      "image/png": "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lXs2eFHGqCAfe8xiYa8p6hh96vWamZkpLFiwQHB3dxf09fVlP9sdO3bka/v+MQrysXFX5bVZWD0JCQnCjBkzBFdXV0FPT08wMTERPDw8hNmzZwvp6elybVNSUoQFCxYItWrVEkqVKiXo6+sLjo6OQocOHYS1a9cKaWlpgiC8ezb63LlzhRYtWgi2traCrq6uYG1tLTRr1kzYsWMHH71IpASRIBTybDYi0gjPnj2Di4sLGjVqVOD60/DwcFSoUAFDhgyBv7//ly3wPd7e3ti8eTOeP3+u1MfK07dNXa5XIqJPwTXoRAQ/Pz8IgoDx48eXdClEREQaj2vQiTRUREQEduzYgcePH2PTpk3w8PBA7969S7osIiIijceATqShnj17hlmzZsHQ0BBt2rTBn3/++dFPGiQiIqLPj2vQiYiIiIjUCKfLiIiIiIjUCAM6EREREZEaYUAnIiIiIlIjDOhERERERGqET3Eh+oq9efMGOTk5JV2GRrG0tER8fHxJl6GROPYlh2NfMjjuJedzjb22tjbMzMw+3k7lRyaiLyYnJwcSiaSky9AYIpEIwLtx5wOwviyOfcnh2JcMjnvJUYex5xIXIiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREakS7pAsgok83cf9zPIhNK+kyNMz9ki5Ag3HsSw7HvmRw3IOHVy7pEkoEZ9CJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERER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/dC9e/eQlZWFn3/+WW573mMWi3o9ERERkWYSCSW1uEYBHx8fODo6wtvbu6RLIfoq9F9/GQ9i00q6DCIios8ieHjlL35MkUgEGxsbxMTEqHwNuo6OTpFuEv2mP0mUiIiIiOhro3ZLXFRt0KBBBe6bPXu2ypZAfCmhoaFYt26dwn2WlpZYsmTJF65I3pQpUxAfH69w3/fffy/3Mb3qZO/evdi3b5/CfVWqVMHs2bO/cEVERESkqdRqicvnEBsbW+C+MmXKFOnRfOokMzMTycnJCvdpaWkV6dcmn1N8fDxyc3MV7jMxMVHbT79MS0tDWpripSK6urr5HomoLrjEhYiIvmWausTlm59BL8lPgfocDAwM1DbkAijxNwifysjIqMCn3RARERF9SVyDTkRERESkRhjQiYiIiIjUCAM6EREREZEaYUAnIiIiIlIjDOhERERERGqEAZ2IiIiISI0woBMRERERqREGdCIiIiIiNcKATkRERESkRhjQiYiIiIjUCAM6EREREZEaYUAnIiIiIlIjDOhERERERGqEAZ2IiIiISI0woBMRERERqREGdCIiIiIiNcKATkRERESkRhjQiYiIiIjUCAM6EREREZEaYUAnIiIiIlIjDOhERERERGqEAZ2IiIiISI0woBMRERERqREGdCIiIiIiNcKATkRERESkRhjQiYiIiIjUCAM6EREREZEaYUAnIiIiIlIjDOhERERERGqEAZ2IiIiISI0woBMRERERqREGdCIiIiIiNcKATkRERESkRhjQiYiIiIjUCAM6EREREZEaYUAnIiIiIlIjDOhERERERGpEu6QLIKJPt7xbBUgkkpIuQ2OIRCLY2NggJiYGgiCUdDkahWNfcjj2JYPjrtk4g05EREREpEYY0ImIiIiI1AgDOhERERGRGmFAJyIiIiJSIwzoRERERERq5JMD+tu3b+Hn54fQ0FBV1kNEREREpNE+OaDr6enh9u3bePv2rSrrISIiIiLSaEotcalcuTIePXqkqlqIiIiIiDSeUgF92LBhePDgAQICAvD69WtV1UREREREpLGU+iTR6dOnIzc3F/v27cO+ffugpaUFHR2dfO02b96szGGIiIiIiDSGUgG9fv36EIlEqqqFiIiIiEjjKRXQx40bp6o6iIiIiIgIfA46EREREZFaUWoGHQASEhKwd+9e3L17FykpKZg+fTrc3NyQkpKCoKAgtGjRAhUqVFBFrURERERE3zylZtBfvnyJGTNm4MKFC7CyskJGRgakUikAwNjYGA8fPsSxY8dUUigRERERkSZQKqBv27YNpUqVwvLly/HDDz/k21+zZk08ePBAmUMQEREREWkUpQL6/fv30aZNGxgbGyt8mouFhQUSExOVOQQRERERkUZRKqBLpVLo6ekVuD8lJQXa2kovcyciIiIi0hhKBXQnJydcu3ZN4b7c3Fz8999/cHV1VeYQREREREQaRamA3q1bN9y4cQPr169HZGQkACApKQm3bt3C/PnzERUVha5du6qkUCIiIiIiTaDU+pOaNWti3Lhx2LRpE06dOgUAWLlyJQDAwMAA48aNg5ubm/JVEhERERFpCKUXiDdt2hT16tXDrVu3EBsbC6lUCmtra3h4eMDAwEAVNRIRERERaQylAvq9e/dgb28PY2Nj1KtXL9/+lJQUvHz5krPoRERERERFpFRAnzt3Ln744Qc0btxY4f47d+5g+fLlCAwMVOYwRFSAifuf40FsWkmXoWHul3QBGoxjX3KUG/vg4ZVVVAeRZlDqJtGPkUgkEIs/6yGIiIiIiL4pxZ5BT0hIwKtXr2TfR0VF4d69e/naZWRk4NSpU7C0tFSuQiIiIiIiDVLsgH7mzBkEBQXJvt+7dy/27t2rsK1YLMbIkSM/vToiIiIiIg1T7IDesGFDODg4AACWLl2K9u3bo3Jl+bVlIpEIenp6cHR0hKmpqUoKJSIiIiLSBMUO6Pb29rC3twcAjBkzBm5ubrCyslJ5YUREREREmkipp7g0b95c9vWbN2+QnJwMa2tr6OvrK1sXEREREZFGUvoRK2FhYZg0aRJGjx6NmTNn4smTJwDePQN9xowZuHz5stJFEhERERFpCqUC+pUrV+Dn54fSpUujd+/ecvuMjY1RpkwZhISEKHMIIiIiIiKNolRA37NnD9zc3PDbb7+hbdu2+fa7urri+fPnyhyCiIiIiEijKBXQIyIi0LBhwwL3m5iYICUlRZlDEBERERFpFKUCup6eHrKysgrcHxcXByMjI2UOQURERESkUZQK6O7u7vj333+Rm5ubb19SUhJOnz4NDw8PZQ5BRERERKRRlAro/fr1Q2JiImbNmoWTJ08CAG7cuIGAgABMnToVANCrVy/lqyQiIiIi0hBKPQfd1tYW8+bNg7+/PwIDAwEAhw4dAgC4ublh+PDh/BAjIiIiIqJiUCqgA4CDgwN++eUXpKWlITY2FoIgoGzZsjA2NlZFfUREREREGkXpgJ7HyMgILi4uquqOiIiIiEgjqSSg37t3D69evUJaWprC/Z06dVLFYYiIiIiIvnlKBfTw8HAsXboUsbGxhbZjQCciIiIiKhqlAvpff/2FlJQUjBw5EhUrVoShoaGq6iIiIiIi0khKBfTIyEh4eXmhdevWqqqHiIiIiEijKfUcdBsbG1XVQUREREREUDKg9+7dG8ePH0diYqKq6iEiIiIi0mhKLXGpX78+JBIJJk6ciGrVqqFMmTIQi+Uzv0gkwtChQ5UqkoiIiIhIUygV0O/du4f169cjOzsbV69eLbAdAzoRERERUdEoFdA3btwIQ0NDTJ06FS4uLnyKCxERERGRkpRagx4bG4vOnTujevXqDOdERERERCqgVEB3cHBARkaGqmohIiIiItJ4SgX0QYMG4dSpU3jy5Imq6iEiIiIi0mhKrUE/dOgQDAwM8NNPP8He3h4WFhYKn+IyY8YMpYokIiIiItIUSgX0iIgIAICFhQWysrLw8uXLfG1EIpEyhyAiIiIi0ihKBfTVq1erqg4iIiIiIoKSa9CJiIiIiEi1lJpBf19mZiYyMjIgCEK+fRYWFqo6DBERERHRN03pgH7ixAkEBwcjLi6uwDaBgYHKHoaIiIiISCMotcTlxIkT+Pvvv2FtbY2+ffsCADp27Ihu3brB1NQUjo6OGDNmjEoKJSIiIiLSBEoF9GPHjsHDwwOzZ89G69atAQC1atVCv379sHTpUmRmZiI1NVUlhRIRERERaQKlAnpcXBxq164NANDS0gIA5OTkAAAMDQ3RsmVLnDhxQskSiYiIiIg0h1IB3dDQELm5ubKvdXV1kZCQINtvYGCApKQkpQokIiIiItIkSgV0BwcHvHjxQva9q6srTp48icTERCQkJODUqVOwsbFRukgiIiIiIk2hVEBv0qQJIiMjIZFIAAC9e/fGy5cvMWbMGIwbNw7R0dGym0eJiIiIiOjjlHrMYosWLdCiRQvZ95UrV8aSJUtw9epViMViVK9eHba2tkoXSURERESkKT55Bj07OxtHjhzBvXv35LaXLVsWHTp0QLt27RjOiYiISI6/vz/q168PJycndOrUCdevXy+w7ZEjR9C+fXtUqVIFLi4uaNOmDYKCgmT7JRIJFixYgFatWsHFxQW1atXChAkTEBsb+yVOheiz+eSArquri+3btyM6OlqV9ZCa8vHxgb+/f0mXgV27dmH69OklXQYREX2CAwcOYO7cuZgyZQqOHTsGNzc3DBgwQO4BE+8zNTXFhAkTcPDgQZw6dQpeXl6YMmUKQkJCALz7FPPbt29j4sSJOHbsGNavX49nz55h6NChX/CsiFRPqSUu5cqVQ3x8vKpqIfqoLl26oH379iVdRpGsXr0a6enpmDFjRkmXQkSkFtavX4/+/fvDy8sLAPD777/j9OnTCAgIwPjx4/O19/T0lPt+xIgR2L17Ny5fvozmzZvD2NgYAQEBcm3mz5+Pjh07IioqCnZ2dp/vZIg+I6VuEu3bty9OnTqFW7duqaoe0lB5z8//GH19fZQuXfozV1O4otZKRET/k52djVu3bqFJkyaybWKxGI0bN8bVq1c/+npBEBAaGoqnT5+iQYMGBbZLSUmBSCSCsbGxSuomKglKzaAfO3YMRkZGWLBgAaysrGBlZQVdXV25NiKRiDOI3xiJRIKdO3fi/PnzyMjIgIODAwYMGAB3d3cAQGpqKv7++2/cv38f6enpKFu2LLp3747GjRvL+vDx8YGDgwO0tLQQGhqKcuXKoVevXpg7dy5++eUXbN++HS9fvoSjoyPGjh0ru59h165dCAsLw+LFiwH8b5a6cuXKCA4ORk5ODjw9PeHt7Q1t7XeX95s3b/DXX3/hzp07MDU1Rb9+/bBz50506NABHTt2/Oj59unTByNGjMD169dx584ddO7cGb169cLatWtx584dJCUlwcLCAm3btkWHDh1kdf7777+y1wPAnDlz4O7ujoSEBGzZsgW3bt2CSCRClSpV4O3tDSsrKxX9hIiI1E9iYiJyc3NhYWEht93S0hJPnz4t8HUpKSmoXbs2srOzoaWlhYULF6Jp06YK22ZlZWHhwoXo1q1biU/mEClDqYAeEREBALCwsIBUKlV4U4ZIJFLmEKSG/v77b0RFRWHSpEkwMzPD5cuXsXDhQvj5+cHGxgYSiQROTk7o1q0bDAwMcO3aNaxatQrW1tZwcXGR9fPvv//iu+++w2+//QbgXZAGgICAAAwePBjGxsZYv349/vzzT1kbRe7evQszMzPMmTMHsbGxWLZsGRwdHdG6dWsAwKpVq5CamgofHx9oaWlhy5YtSE5OLtY57969G/3794e3tze0tLQglUphbm6OKVOmoHTp0nj48CHWrVsHU1NTeHp6okuXLoiKikJmZibGjh0LADAyMkJOTg4WLFgAV1dXzJs3D2KxGHv37pWNX96big9JJBLZ40yBd3+vDAwMinUOREQlRSQSyfLA+19/2EaR0qVL4+TJk0hPT8e5c+cwd+5clC9fPt/yF4lEgtGjR0MQBPz+++9fff54f7zoy1KHsVcqoK9evVpVddBXIiEhASEhIVizZg3KlCkD4N268Js3b+LMmTPo378/ypQpgy5dushe0759e9y8eRP//fefXEC3sbHBwIEDZd/nBfS+ffvCzc0NANC1a1f8/vvvyM7OzvfbmTxGRkYYPnw4xGIx7OzsULNmTdy5cwetW7dGVFQUbt++jUWLFsHZ2RkAMHr0aEyYMKFY592oUSO5R4oC/5sZBwArKys8evQIFy5cgKenJ/T19aGrqwuJRAJTU1NZu7Nnz0IQBIwePVr2F3/s2LHw9vbG3bt34eHhofD4+/btk3tyQYUKFeDr61uscyAiKik2NjYwNzeHlpYWcnNz5T7EMD09HQ4ODoV+sGHeWvI2bdogKioK69atQ8+ePWX7JRIJ+vTpg7i4OISEhMDc3PzzncwXZm1tXdIlaKySHHulAjppnoiICEilUkycOFFue05ODoyMjAAAUqkUe/fuxYULF5CYmIicnBzk5OTkC9gVKlRQeIzy5cvLvjYzMwPw7lecH/5aNI+9vT3EYrHca/J+uxMdHQ0tLS25Y1lbW6NUqVJFPWUAkIX79x07dgxnzpxBQkICsrOzkZOTA0dHx0L7efHiBWJjYzF48GC57RKJBHFxcQW+rnv37ujUqZPse86oENHXJCYmBgBQvXp1HDx4EPXr1wfw7v8XJ0+ehLe3t6zNx6SlpSE1NVXWXiKRYNSoUXj+/DmCgoKQnZ1d5L7UmUgkgrW1NWJjYyEIQkmXo1E+59hra2vD0tLy4+1UdcDMzExkZGQoPJGCghV9fbKysiAWi+Hr6ysXioF3N3ACwMGDB3H06FEMGTIE5cqVg76+Pvz9/fPdXJnX/kNaWlqyr/OCqFQqLbCm99vnvUbVf6H09PTkvj9//jy2bt2KwYMHw9XVFQYGBjh48CAeP35caD9ZWVlwcnJSOINf2A1NOjo60NHR+bTiiYhKWN6/ySNHjsTkyZNRvXp11KxZE+vXr0dGRga8vLwgCAImTJgAGxsbzJo1CwCwcuVKeHh4oHz58sjOzsbp06exZ88eLFq0CIIgQCKR4Pvvv8ft27exefNm5OTkyCY7TE1NC/zN69dEEAQG9BJSkmOvdEA/ceIEgoODC539CwwMVPYwpCYcHR0hlUqRnJyMKlWqKGzz4MED1KlTR3YTj1QqRUxMTIk87srW1ha5ubkIDw+Hk5MTACA2Nhbp6elK9fvw4UNUqlQJbdu2lW378O+AtrZ2vjcWFSpUwH///QdjY2MYGhoqVQMR0dema9euSExMhJ+fH+Lj4+Hu7o5t27bJZhSjo6PlJn8yMjIwa9YsxMbGQl9fH87OzlixYgW6du0K4N2/5ydOnAAAfPfdd3LH2r17d7516kRfC6UC+okTJ/D333/Dw8MDLVq0QEBAADp27AgdHR2EhITA1NT0q3lmNRWNra0tGjdujFWrVmHw4MGoUKECUlJScPv2bZQvXx61atWCjY0NLl68iIcPH6JUqVIIDg5GUlJSiQR0Ozs7VKtWDWvXrsXIkSNlN4nq6uoqtUzE2toa//77L27cuAErKyucPXsWT548kXsSi6WlJW7evIno6GgYGRnB0NAQTZo0waFDh7B48WL06dMH5ubmiI+Px6VLl9C1a9dvat0kEZEiQ4cOLfCDhN6/1wYAZs6ciZkzZxbYl4ODA6KiolRaH5E6UPoxix4eHpg9ezZSU1MREBCAWrVqoWrVqujatSt+/PFHpKamqqpWUhNjx47F3r17sWXLFiQmJsLY2BgVK1ZE7dq1AQA9e/ZEXFwcFixYAD09PbRq1Qp169ZFRkZGidQ7fvx4/PXXX5gzZ47sMYsvX75UaslImzZtEB4ejmXLlkEkEqFRo0Zo27at3EdWt27dGvfu3cOPP/6IrKws2WMW586di23btsHPzw9ZWVkoU6YMqlatyqeyEBEREQBAJCixuGbAgAEYPHgw2rZti4yMDAwdOhSzZs1CjRo1AAD79+/H6dOnsXLlSlXVS6S0169fY8yYMfjll19QrVq1ki5HKf3XX8aD2LSSLoOIqFDBwyuXdAlfHZFIBBsbG8TExHAN+hf2OcdeR0fn898kamhoiNzcXNnXurq6SEhIkO03MDBAUlKSMocgUtqdO3eQlZWFcuXK4c2bN7L1jgWtoSciIiIqSUoFdAcHB7x48UL2vaurK06ePIlatWpBKpXi1KlThT7XlOhLyMnJwc6dOxEXFwcDAwO4urpiwoQJ0NbWRmhoKNatW6fwdZaWlliyZMkXrpaIiIg0nVIBvUmTJjh58iQkEgl0dHTQu3dv/PbbbxgzZsy7zrW1MXXqVJUUSvSpatSoIVt29aE6deqgYsWKCvd9+PhGIiIioi9BqYDeokULuU9XrFy5MpYsWYIrV65AS0sL1atXh62trdJFEn0uBgYGvDmTiIiI1IrKP0m0bNmy6Nixo6q7JSIiIiLSCCoJ6BEREbh+/Tri4+MBAFZWVqhRowbKlSuniu6JiIiIiDSGUgFdIpFg3bp1OHv2LID/fSy7IAjYvn07mjRpgtGjR0NbW+UT9URERERE3ySlkvP27dtx9uxZfPfdd2jfvj3Kli0LkUiE2NhYHDlyBCdPnoSRkRG8vb1VVC4RERER0bdNrMyLQ0ND0aRJEwwfPhy2trbQ0tKCWCyGra0tRowYgcaNGyM0NFRVtRIRERERffOUCug5OTlwdXUtcH+lSpVkH2REREREREQfp1RA9/DwwI0bNwrcf+PGDVSvXl2ZQxARERERaRSlAnrfvn0RHx8PPz8/3L59G/Hx8YiPj8etW7ewePFixMfHo2/fvkhLS5P7Q0REREREiil1k+jkyZMBvHvMYlhYWKFt3hcYGKjMYYmIiIiIvllKBfSePXvKHq1IRERERETKUyqg9+nTR1V1EBERERERlFiD/vbtWwwbNgwHDx5UZT1ERERERBrtkwO6np4etLS0oKenp8p6iIiIiIg0mlJPcalfvz4uXrwIQRBUVQ8RERERkUZTag26p6cn/v77b8ydOxetWrWCpaUldHV187VzcnJS5jBERERERBpDqYA+d+5c2df3798vsB0fq0hEREREVDRKBfQxY8aoqg4iIiIiIoKSAb158+YqKoOIiIiIiAAlbxJ935s3bxAeHo6srCxVdUlEREREpHGUDuhhYWGYNGkSRo8ejZkzZ+LJkycAgJSUFMyYMQOXL19WukgiIiIiIk2hVEC/cuUK/Pz8ULp0afTu3Vtun7GxMcqUKYOQkBBlDkFEREREpFGUCuh79uyBm5sbfvvtN7Rt2zbffldXVzx//lyZQxARERERaRSlAnpERAQaNmxY4H4TExOkpKQocwgiIiIiIo2iVEDX09Mr9KbQuLg4GBkZKXMIIiIiIiKNolRAd3d3x7///ovc3Nx8+5KSknD69Gl4eHgocwgiIiIiIo2iVEDv168fEhMTMWvWLJw8eRIAcOPGDQQEBGDq1KkAgF69eilfJRERERGRhlDqg4psbW0xb948+Pv7IzAwEABw6NAhAICbmxuGDx8OKysr5askIiIiItIQSgV0AHBwcMAvv/yCtLQ0xMbGQhAElC1bFsbGxqqoj4iIiIhIoygd0PMYGRnBxcVFVd0REREREWkkpQN6SkoK9u/fj+vXryM+Ph4AYGlpiZo1a6JLly4wNTVV9hBERERERBpDqZtEIyMjMXXqVBw+fBiGhoZo0KABGjRoAENDQxw+fBjTp09HRESEqmolIiIiIvrmKTWD/vfff0MqlWLBggX5lrc8efIEixYtwqZNmzBnzhyliiQiIiIi0hRKzaA/efIEHTp0ULj23MXFBe3bt8fjx4+VOQQRERERkUZRKqCbmJhAR0enwP26urowMTFR5hBERERERBpFqYDeoUMHnDx5EklJSfn2JSYm4sSJE+jQoYMyhyAiIiIi0ihKrUEXBAH6+vr44YcfUK9ePVhbWwMAYmJiEBYWBmtrawiCgODgYLnXderUSZnDEhERERF9s5QK6Fu3bpV9fe7cuXz7IyIi5NrkYUAnIiIiIlJMqYC+atUqVdVBRJ9gebcKkEgkJV2GxhCJRLCxsUFMTAwEQSjpcjQKx77kcOyJvjylArqlpaWq6iAiIiIiIih5k+jChQtx7tw5ZGdnq6oeIiIiIiKNptQMelxcHFauXAl9fX3UrVsXTZs2RbVq1SASiVRVHxERERGRRlEqoC9fvhxPnjxBaGgoLly4gNDQUJiamqJx48Zo0qQJHB0dVVQmEREREZFmUCqgA+8+MdTFxQVDhgzBrVu3EBoailOnTiE4OBj29vZo2rQpGjduDHNzc1XUS0RERET0TVM6oOcRi8WoUaMGatSogfT0dKxbtw4XL17Ejh07sHPnTri7u6Njx46oVauWqg5JRERERPTNUVlAB4AHDx7g7NmzuHTpEtLS0uDg4ICmTZtCW1sbZ86cga+vL3r06AEvLy9VHpaIiIiI6JuhdEB/+fIlzp49i/PnzyMhIQEmJiZo1qwZmjZtKrcGvUOHDli7di2OHz/OgE5EREREVAClAvr06dMREREBHR0d1KlTByNGjICHhwfEYsVPb3R3d8c///yjzCGJiIiIiL5pSgV0Q0NDjBo1Cg0aNIChoeFH29etW5efPkpEREREVAilAvrcuXOL1V5PT4+fPkpEREREVIhiB/Rp06YVq71IJMLixYuLexgiIiIiIo1U7IBuZGQk90mhOTk5ePToEcqVKwcjIyOVFkdEREREpGmKHdB9fHzkvk9JScHIkSMxZMgQVK1aVVV1ERERERFpJMWPWymG92fTiYiIiIhIOUoHdCIiIiIiUh0GdCIiIiIiNcKATkRERESkRop9k+izZ8/kvs/IyAAAxMTEFPhhRU5OTp9QGhERERGR5il2QJ81a5bC7Rs2bCjwNYGBgcU9DBERERGRRip2QB8zZsznqIOIiIiIiPAJAb158+afoQwiIiIiIgJ4kygRERERkVop9gw6EamPifuf40FsWkmXoWHul3QBGqz4Yx88vPJnqIOI6PPiDDoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIiIiUiMM6EREREREaoQBnYiIiIhIjTCgExERERGpEQZ0IiIiIiI1woBORERERKRGGNCJiIiIiNQIAzoRERERkRphQCciIo3g7++P+vXrw8nJCZ06dcL169cLbLt9+3Z0794dbm5ucHNzg5eXV772R44cQb9+/eDu7g47OzvcuXPnc58CEWkIBnT6IsaNG4fDhw8Xuf2rV6/Qp08fhIeHf76i/r/i1kZEX58DBw5g7ty5mDJlCo4dOwY3NzcMGDAACQkJCttfuHABXbt2xa5du3Dw4EHY2tqif//+iImJkbXJyMhAvXr18NNPP32p0yAiDaFd0gWQZli0aBH09PRU2mdISAj8/f3h7++v0n6J6Nuz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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import optuna\n",
    "from optuna.visualization.matplotlib import (\n",
    "    plot_optimization_history,\n",
    "    plot_intermediate_values,\n",
    "    plot_param_importances\n",
    ")\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Load the study from RDB storage\n",
    "storage = optuna.storages.RDBStorage(\"sqlite:///optuna_trials.db\")\n",
    "\n",
    "study = optuna.load_study(\n",
    "    study_name=\"transformers_optuna_study\",\n",
    "    storage=storage\n",
    ")\n",
    "\n",
    "# Plot optimization history\n",
    "ax1 = plot_optimization_history(study)\n",
    "plt.show()\n",
    "ax1.figure.savefig(\"optimization_history.png\")\n",
    "\n",
    "# Plot intermediate values (if using pruning and intermediate reports)\n",
    "ax2 = plot_intermediate_values(study)\n",
    "plt.show()\n",
    "ax2.figure.savefig(\"intermediate_values.png\")\n",
    "\n",
    "# Plot parameter importances\n",
    "ax3 = plot_param_importances(study)\n",
    "plt.show()\n",
    "ax3.figure.savefig(\"param_importances.png\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae8def79",
   "metadata": {},
   "source": [
    "## Perform Final Training\n",
    "\n",
    "Once you've completed hyperparameter optimization with Optuna, it’s time to capitalize on your best findings and carry out the final round of training. \n",
    "\n",
    "### 1. **Retrieve Your Ingredients**  \n",
    "   Access the best set of hyperparameters identified during the tuning process. \n",
    "\n",
    "### 2. **Configure Training Parameters**  \n",
    "   Plug those hyperparameter values into your training setup. This might include adjustments to learning rate, batch size, number of epochs, dropout rate, and other model-specific knobs that influence training behavior.\n",
    "\n",
    "### 3. **Incorporate into Model Setup**  \n",
    "   Apply the optimized values to initialize and configure your model. This ensures your final training run is guided by the most effective settings discovered through trial and error.\n",
    "\n",
    "### 4. **Fine-Tune Your Training Pipeline**  \n",
    "   Set up your optimizer, loss function, and data loaders using the best parameters. Everything from how fast your model learns to how much data it sees at once should reflect your refined configuration.\n",
    "\n",
    "### 5. **Run Full Training**  \n",
    "   Begin training your model using the entire training dataset (or at least the train/validation split you used during HPO). This pass should reflect your best shot at learning the patterns in the data without exploratory variation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6cd2f800",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8493882fcaf841f7bf64606edcf2b28e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/25000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3626375d66dd49b79684b966e0f190dd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/25000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f98a9164e26c432da1cba82ab0dc874e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/50000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from datasets import load_dataset\n",
    "from transformers import AutoTokenizer\n",
    "\n",
    "# Load IMDb dataset\n",
    "dataset = load_dataset(\"imdb\")\n",
    "\n",
    "# Load tokenizer\n",
    "tokenizer = AutoTokenizer.from_pretrained(\"bert-base-uncased\")\n",
    "\n",
    "# Tokenize the text\n",
    "def tokenize_function(example):\n",
    "    return tokenizer(example[\"text\"], padding=\"max_length\", truncation=True)\n",
    "\n",
    "# Apply tokenization\n",
    "tokenized_dataset = dataset.map(tokenize_function, batched=True)\n",
    "\n",
    "# Clean up columns\n",
    "tokenized_dataset = tokenized_dataset.remove_columns([\"text\"])\n",
    "tokenized_dataset = tokenized_dataset.rename_column(\"label\", \"labels\")\n",
    "\n",
    "# Set PyTorch format\n",
    "tokenized_dataset.set_format(\"torch\", columns=[\"input_ids\", \"attention_mask\", \"labels\"])\n",
    "\n",
    "# Subset for quick testing (optional)\n",
    "train_dataset = tokenized_dataset[\"train\"].shuffle(seed=42).select(range(2000))\n",
    "valid_dataset = tokenized_dataset[\"test\"].shuffle(seed=42).select(range(500))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "07849a94",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_5615/1607841219.py:24: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `Trainer.__init__`. Use `processing_class` instead.\n",
      "  trainer = Trainer(\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='375' max='375' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [375/375 09:21, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.456700</td>\n",
       "      <td>0.337511</td>\n",
       "      <td>0.856000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.215200</td>\n",
       "      <td>0.438220</td>\n",
       "      <td>0.876000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.084600</td>\n",
       "      <td>0.499159</td>\n",
       "      <td>0.888000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer\n",
    "\n",
    "# Define the model\n",
    "model = AutoModelForSequenceClassification.from_pretrained(\"bert-base-uncased\", num_labels=2)\n",
    "\n",
    "# Load best hyperparameters (already defined earlier as best_hparams)\n",
    "training_args = TrainingArguments(\n",
    "    output_dir=\"./final_model\",\n",
    "    learning_rate=best_hparams[\"learning_rate\"],\n",
    "    per_device_train_batch_size=best_hparams[\"per_device_train_batch_size\"],\n",
    "    weight_decay=best_hparams[\"weight_decay\"],    \n",
    "    eval_strategy=\"epoch\",\n",
    "    save_strategy=\"epoch\",\n",
    "    load_best_model_at_end=True,\n",
    "    logging_strategy=\"epoch\",\n",
    "    num_train_epochs=3,\n",
    "    report_to=\"wandb\",\n",
    "    run_name=\"final_run_with_best_hparams\"\n",
    ")\n",
    "\n",
    "# Create Trainer\n",
    "trainer = Trainer(\n",
    "    model=model,\n",
    "    args=training_args,\n",
    "    train_dataset=train_dataset,\n",
    "    eval_dataset=valid_dataset,\n",
    "    processing_class=tokenizer,  \n",
    "    compute_metrics=lambda eval_pred: {\n",
    "        \"accuracy\": (eval_pred.predictions.argmax(-1) == eval_pred.label_ids).mean()\n",
    "    }\n",
    ")\n",
    "\n",
    "# Train\n",
    "trainer.train()\n",
    "\n",
    "# Save the model\n",
    "trainer.save_model(\"./final_model\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de469553",
   "metadata": {},
   "source": [
    "## Uploading to Hugging Face Hub\n",
    "\n",
    "You've successfully trained a powerful and optimized model, it's time to serve it up to the world. Sharing your model on the Hugging Face Hub not only makes it reusable and accessible for inference, but also contributes to the open-source community.\n",
    "\n",
    "### 1. **Celebrate the Optimization Payoff**  \n",
    "   After rigorous tuning and final training, your model now performs more efficiently and consistently. These improvements make it ideal for real-world tasks such as sentiment analysis, like classifying movie reviews to fine-tune content recommendations.\n",
    "\n",
    "### 2. **Save Your Work Locally**  \n",
    "   Before sharing, save the trained model—including the weights, configuration, tokenizer (if applicable), and training artifacts—on your local system. This step ensures that your model setup is reproducible and ready to be uploaded.\n",
    "\n",
    "### 3. **Authenticate with Hugging Face Hub**  \n",
    "   To upload your model, you’ll need to log in to the Hugging Face Hub. Whether through a terminal or notebook interface, authentication links your environment to your personal or organizational space on the platform, enabling push access.\n",
    "\n",
    "### 4. **Upload and Share**  \n",
    "   Push your saved model to the Hugging Face Hub. This makes the model publicly accessible—or private and enables others to load, use, and fine-tune it. You’ll also create a model card to explain what the model does, its intended use cases, and performance benchmarks.\n",
    "\n",
    "#### 📌 Why It Matters:\n",
    "- Centralized model storage encourages versioning, reproducibility, and transparency.\n",
    "- The Hub simplifies integration for downstream tasks through `transformers`compatible APIs.\n",
    "- Sharing models builds your profile and supports collaboration within the machine learning community."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e524424b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cb7eabc38cd845929c74f7f52ae98aba",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "README.md:   0%|          | 0.00/31.0 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "35d0f752cae94cea9082ba475c1940d8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "model.safetensors:   0%|          | 0.00/438M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "CommitInfo(commit_url='https://huggingface.co/AINovice2005/bert-imdb-optuna-hpo/commit/cf4e9bcfd581cc9cd33f7403c5fa2e5074f58e6c', commit_message='Upload tokenizer', commit_description='', oid='cf4e9bcfd581cc9cd33f7403c5fa2e5074f58e6c', pr_url=None, repo_url=RepoUrl('https://huggingface.co/AINovice2005/bert-imdb-optuna-hpo', endpoint='https://huggingface.co', repo_type='model', repo_id='AINovice2005/bert-imdb-optuna-hpo'), pr_revision=None, pr_num=None)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "\n",
    "# Load your saved model from the path\n",
    "model = AutoModelForSequenceClassification.from_pretrained(\"./final_model\")\n",
    "tokenizer = AutoTokenizer.from_pretrained(\"./final_model\")\n",
    "\n",
    "# Push to your repository on the hub\n",
    "model.push_to_hub(\"AINovice2005/bert-imdb-optuna-hpo\")\n",
    "tokenizer.push_to_hub(\"AINovice2005/bert-imdb-optuna-hpo\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "optuna",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
